home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / perl / 5.10.0 / Params / Check.pm
Encoding:
Perl POD Document  |  2009-06-26  |  19.3 KB  |  713 lines

  1. package Params::Check;
  2.  
  3. use strict;
  4.  
  5. use Carp                        qw[carp croak];
  6. use Locale::Maketext::Simple    Style => 'gettext';
  7.  
  8. use Data::Dumper;
  9.  
  10. BEGIN {
  11.     use Exporter    ();
  12.     use vars        qw[ @ISA $VERSION @EXPORT_OK $VERBOSE $ALLOW_UNKNOWN
  13.                         $STRICT_TYPE $STRIP_LEADING_DASHES $NO_DUPLICATES
  14.                         $PRESERVE_CASE $ONLY_ALLOW_DEFINED $WARNINGS_FATAL
  15.                         $SANITY_CHECK_TEMPLATE $CALLER_DEPTH $_ERROR_STRING
  16.                     ];
  17.  
  18.     @ISA        =   qw[ Exporter ];
  19.     @EXPORT_OK  =   qw[check allow last_error];
  20.  
  21.     $VERSION                = '0.26';
  22.     $VERBOSE                = $^W ? 1 : 0;
  23.     $NO_DUPLICATES          = 0;
  24.     $STRIP_LEADING_DASHES   = 0;
  25.     $STRICT_TYPE            = 0;
  26.     $ALLOW_UNKNOWN          = 0;
  27.     $PRESERVE_CASE          = 0;
  28.     $ONLY_ALLOW_DEFINED     = 0;
  29.     $SANITY_CHECK_TEMPLATE  = 1;
  30.     $WARNINGS_FATAL         = 0;
  31.     $CALLER_DEPTH           = 0;
  32. }
  33.  
  34. my %known_keys = map { $_ => 1 }
  35.                     qw| required allow default strict_type no_override
  36.                         store defined |;
  37.  
  38. =pod
  39.  
  40. =head1 NAME
  41.  
  42. Params::Check - A generic input parsing/checking mechanism.
  43.  
  44. =head1 SYNOPSIS
  45.  
  46.     use Params::Check qw[check allow last_error];
  47.  
  48.     sub fill_personal_info {
  49.         my %hash = @_;
  50.         my $x;
  51.  
  52.         my $tmpl = {
  53.             firstname   => { required   => 1, defined => 1 },
  54.             lastname    => { required   => 1, store => \$x },
  55.             gender      => { required   => 1,
  56.                              allow      => [qr/M/i, qr/F/i],
  57.                            },
  58.             married     => { allow      => [0,1] },
  59.             age         => { default    => 21,
  60.                              allow      => qr/^\d+$/,
  61.                            },
  62.  
  63.             phone       => { allow => [ sub { return 1 if /$valid_re/ },
  64.                                         '1-800-PERL' ]
  65.                            },
  66.             id_list     => { default        => [],
  67.                              strict_type    => 1
  68.                            },
  69.             employer    => { default => 'NSA', no_override => 1 },
  70.         };
  71.  
  72.         ### check() returns a hashref of parsed args on success ###
  73.         my $parsed_args = check( $tmpl, \%hash, $VERBOSE )
  74.                             or die qw[Could not parse arguments!];
  75.  
  76.         ... other code here ...
  77.     }
  78.  
  79.     my $ok = allow( $colour, [qw|blue green yellow|] );
  80.  
  81.     my $error = Params::Check::last_error();
  82.  
  83.  
  84. =head1 DESCRIPTION
  85.  
  86. Params::Check is a generic input parsing/checking mechanism.
  87.  
  88. It allows you to validate input via a template. The only requirement
  89. is that the arguments must be named.
  90.  
  91. Params::Check can do the following things for you:
  92.  
  93. =over 4
  94.  
  95. =item *
  96.  
  97. Convert all keys to lowercase
  98.  
  99. =item *
  100.  
  101. Check if all required arguments have been provided
  102.  
  103. =item *
  104.  
  105. Set arguments that have not been provided to the default
  106.  
  107. =item *
  108.  
  109. Weed out arguments that are not supported and warn about them to the
  110. user
  111.  
  112. =item *
  113.  
  114. Validate the arguments given by the user based on strings, regexes,
  115. lists or even subroutines
  116.  
  117. =item *
  118.  
  119. Enforce type integrity if required
  120.  
  121. =back
  122.  
  123. Most of Params::Check's power comes from its template, which we'll
  124. discuss below:
  125.  
  126. =head1 Template
  127.  
  128. As you can see in the synopsis, based on your template, the arguments
  129. provided will be validated.
  130.  
  131. The template can take a different set of rules per key that is used.
  132.  
  133. The following rules are available:
  134.  
  135. =over 4
  136.  
  137. =item default
  138.  
  139. This is the default value if none was provided by the user.
  140. This is also the type C<strict_type> will look at when checking type
  141. integrity (see below).
  142.  
  143. =item required
  144.  
  145. A boolean flag that indicates if this argument was a required
  146. argument. If marked as required and not provided, check() will fail.
  147.  
  148. =item strict_type
  149.  
  150. This does a C<ref()> check on the argument provided. The C<ref> of the
  151. argument must be the same as the C<ref> of the default value for this
  152. check to pass.
  153.  
  154. This is very useful if you insist on taking an array reference as
  155. argument for example.
  156.  
  157. =item defined
  158.  
  159. If this template key is true, enforces that if this key is provided by
  160. user input, its value is C<defined>. This just means that the user is
  161. not allowed to pass C<undef> as a value for this key and is equivalent
  162. to:
  163.     allow => sub { defined $_[0] && OTHER TESTS }
  164.  
  165. =item no_override
  166.  
  167. This allows you to specify C<constants> in your template. ie, they
  168. keys that are not allowed to be altered by the user. It pretty much
  169. allows you to keep all your C<configurable> data in one place; the
  170. C<Params::Check> template.
  171.  
  172. =item store
  173.  
  174. This allows you to pass a reference to a scalar, in which the data
  175. will be stored:
  176.  
  177.     my $x;
  178.     my $args = check(foo => { default => 1, store => \$x }, $input);
  179.  
  180. This is basically shorthand for saying:
  181.  
  182.     my $args = check( { foo => { default => 1 }, $input );
  183.     my $x    = $args->{foo};
  184.  
  185. You can alter the global variable $Params::Check::NO_DUPLICATES to
  186. control whether the C<store>'d key will still be present in your
  187. result set. See the L<Global Variables> section below.
  188.  
  189. =item allow
  190.  
  191. A set of criteria used to validate a particular piece of data if it
  192. has to adhere to particular rules.
  193.  
  194. See the C<allow()> function for details.
  195.  
  196. =back
  197.  
  198. =head1 Functions
  199.  
  200. =head2 check( \%tmpl, \%args, [$verbose] );
  201.  
  202. This function is not exported by default, so you'll have to ask for it
  203. via:
  204.  
  205.     use Params::Check qw[check];
  206.  
  207. or use its fully qualified name instead.
  208.  
  209. C<check> takes a list of arguments, as follows:
  210.  
  211. =over 4
  212.  
  213. =item Template
  214.  
  215. This is a hashreference which contains a template as explained in the
  216. C<SYNOPSIS> and C<Template> section.
  217.  
  218. =item Arguments
  219.  
  220. This is a reference to a hash of named arguments which need checking.
  221.  
  222. =item Verbose
  223.  
  224. A boolean to indicate whether C<check> should be verbose and warn
  225. about what went wrong in a check or not.
  226.  
  227. You can enable this program wide by setting the package variable
  228. C<$Params::Check::VERBOSE> to a true value. For details, see the
  229. section on C<Global Variables> below.
  230.  
  231. =back
  232.  
  233. C<check> will return when it fails, or a hashref with lowercase
  234. keys of parsed arguments when it succeeds.
  235.  
  236. So a typical call to check would look like this:
  237.  
  238.     my $parsed = check( \%template, \%arguments, $VERBOSE )
  239.                     or warn q[Arguments could not be parsed!];
  240.  
  241. A lot of the behaviour of C<check()> can be altered by setting
  242. package variables. See the section on C<Global Variables> for details
  243. on this.
  244.  
  245. =cut
  246.  
  247. sub check {
  248.     my ($utmpl, $href, $verbose) = @_;
  249.  
  250.     ### did we get the arguments we need? ###
  251.     return if !$utmpl or !$href;
  252.  
  253.     ### sensible defaults ###
  254.     $verbose ||= $VERBOSE || 0;
  255.  
  256.     ### clear the current error string ###
  257.     _clear_error();
  258.  
  259.     ### XXX what type of template is it? ###
  260.     ### { key => { } } ?
  261.     #if (ref $args eq 'HASH') {
  262.     #    1;
  263.     #}
  264.  
  265.     ### clean up the template ###
  266.     my $args = _clean_up_args( $href ) or return;
  267.  
  268.     ### sanity check + defaults + required keys set? ###
  269.     my $defs = _sanity_check_and_defaults( $utmpl, $args, $verbose )
  270.                     or return;
  271.  
  272.     ### deref only once ###
  273.     my %utmpl   = %$utmpl;
  274.     my %args    = %$args;
  275.     my %defs    = %$defs;
  276.  
  277.     ### flag to see if anything went wrong ###
  278.     my $wrong; 
  279.     
  280.     ### flag to see if we warned for anything, needed for warnings_fatal
  281.     my $warned;
  282.  
  283.     for my $key (keys %args) {
  284.  
  285.         ### you gave us this key, but it's not in the template ###
  286.         unless( $utmpl{$key} ) {
  287.  
  288.             ### but we'll allow it anyway ###
  289.             if( $ALLOW_UNKNOWN ) {
  290.                 $defs{$key} = $args{$key};
  291.  
  292.             ### warn about the error ###
  293.             } else {
  294.                 _store_error(
  295.                     loc("Key '%1' is not a valid key for %2 provided by %3",
  296.                         $key, _who_was_it(), _who_was_it(1)), $verbose);
  297.                 $warned ||= 1;
  298.             }
  299.             next;
  300.         }
  301.  
  302.         ### check if you're even allowed to override this key ###
  303.         if( $utmpl{$key}->{'no_override'} ) {
  304.             _store_error(
  305.                 loc(q[You are not allowed to override key '%1'].
  306.                     q[for %2 from %3], $key, _who_was_it(), _who_was_it(1)),
  307.                 $verbose
  308.             );
  309.             $warned ||= 1;
  310.             next;
  311.         }
  312.  
  313.         ### copy of this keys template instructions, to save derefs ###
  314.         my %tmpl = %{$utmpl{$key}};
  315.  
  316.         ### check if you were supposed to provide defined() values ###
  317.         if( ($tmpl{'defined'} || $ONLY_ALLOW_DEFINED) and
  318.             not defined $args{$key}
  319.         ) {
  320.             _store_error(loc(q|Key '%1' must be defined when passed|, $key),
  321.                 $verbose );
  322.             $wrong ||= 1;
  323.             next;
  324.         }
  325.  
  326.         ### check if they should be of a strict type, and if it is ###
  327.         if( ($tmpl{'strict_type'} || $STRICT_TYPE) and
  328.             (ref $args{$key} ne ref $tmpl{'default'})
  329.         ) {
  330.             _store_error(loc(q|Key '%1' needs to be of type '%2'|,
  331.                         $key, ref $tmpl{'default'} || 'SCALAR'), $verbose );
  332.             $wrong ||= 1;
  333.             next;
  334.         }
  335.  
  336.         ### check if we have an allow handler, to validate against ###
  337.         ### allow() will report its own errors ###
  338.         if( exists $tmpl{'allow'} and not do {
  339.                 local $_ERROR_STRING;
  340.                 allow( $args{$key}, $tmpl{'allow'} )
  341.             }         
  342.         ) {
  343.             ### stringify the value in the error report -- we don't want dumps
  344.             ### of objects, but we do want to see *roughly* what we passed
  345.             _store_error(loc(q|Key '%1' (%2) is of invalid type for '%3' |.
  346.                              q|provided by %4|,
  347.                             $key, "$args{$key}", _who_was_it(),
  348.                             _who_was_it(1)), $verbose);
  349.             $wrong ||= 1;
  350.             next;
  351.         }
  352.  
  353.         ### we got here, then all must be OK ###
  354.         $defs{$key} = $args{$key};
  355.  
  356.     }
  357.  
  358.     ### croak with the collected errors if there were errors and 
  359.     ### we have the fatal flag toggled.
  360.     croak(__PACKAGE__->last_error) if ($wrong || $warned) && $WARNINGS_FATAL;
  361.  
  362.     ### done with our loop... if $wrong is set, somethign went wrong
  363.     ### and the user is already informed, just return...
  364.     return if $wrong;
  365.  
  366.     ### check if we need to store any of the keys ###
  367.     ### can't do it before, because something may go wrong later,
  368.     ### leaving the user with a few set variables
  369.     for my $key (keys %defs) {
  370.         if( my $ref = $utmpl{$key}->{'store'} ) {
  371.             $$ref = $NO_DUPLICATES ? delete $defs{$key} : $defs{$key};
  372.         }
  373.     }
  374.  
  375.     return \%defs;
  376. }
  377.  
  378. =head2 allow( $test_me, \@criteria );
  379.  
  380. The function that handles the C<allow> key in the template is also
  381. available for independent use.
  382.  
  383. The function takes as first argument a key to test against, and
  384. as second argument any form of criteria that are also allowed by
  385. the C<allow> key in the template.
  386.  
  387. You can use the following types of values for allow:
  388.  
  389. =over 4
  390.  
  391. =item string
  392.  
  393. The provided argument MUST be equal to the string for the validation
  394. to pass.
  395.  
  396. =item regexp
  397.  
  398. The provided argument MUST match the regular expression for the
  399. validation to pass.
  400.  
  401. =item subroutine
  402.  
  403. The provided subroutine MUST return true in order for the validation
  404. to pass and the argument accepted.
  405.  
  406. (This is particularly useful for more complicated data).
  407.  
  408. =item array ref
  409.  
  410. The provided argument MUST equal one of the elements of the array
  411. ref for the validation to pass. An array ref can hold all the above
  412. values.
  413.  
  414. =back
  415.  
  416. It returns true if the key matched the criteria, or false otherwise.
  417.  
  418. =cut
  419.  
  420. sub allow {
  421.     ### use $_[0] and $_[1] since this is hot code... ###
  422.     #my ($val, $ref) = @_;
  423.  
  424.     ### it's a regexp ###
  425.     if( ref $_[1] eq 'Regexp' ) {
  426.         local $^W;  # silence warnings if $val is undef #
  427.         return if $_[0] !~ /$_[1]/;
  428.  
  429.     ### it's a sub ###
  430.     } elsif ( ref $_[1] eq 'CODE' ) {
  431.         return unless $_[1]->( $_[0] );
  432.  
  433.     ### it's an array ###
  434.     } elsif ( ref $_[1] eq 'ARRAY' ) {
  435.  
  436.         ### loop over the elements, see if one of them says the
  437.         ### value is OK
  438.         ### also, short-cicruit when possible
  439.         for ( @{$_[1]} ) {
  440.             return 1 if allow( $_[0], $_ );
  441.         }
  442.         
  443.         return;
  444.  
  445.     ### fall back to a simple, but safe 'eq' ###
  446.     } else {
  447.         return unless _safe_eq( $_[0], $_[1] );
  448.     }
  449.  
  450.     ### we got here, no failures ###
  451.     return 1;
  452. }
  453.  
  454. ### helper functions ###
  455.  
  456. ### clean up the template ###
  457. sub _clean_up_args {
  458.     ### don't even bother to loop, if there's nothing to clean up ###
  459.     return $_[0] if $PRESERVE_CASE and !$STRIP_LEADING_DASHES;
  460.  
  461.     my %args = %{$_[0]};
  462.  
  463.     ### keys are note aliased ###
  464.     for my $key (keys %args) {
  465.         my $org = $key;
  466.         $key = lc $key unless $PRESERVE_CASE;
  467.         $key =~ s/^-// if $STRIP_LEADING_DASHES;
  468.         $args{$key} = delete $args{$org} if $key ne $org;
  469.     }
  470.  
  471.     ### return references so we always return 'true', even on empty
  472.     ### arguments
  473.     return \%args;
  474. }
  475.  
  476. sub _sanity_check_and_defaults {
  477.     my %utmpl   = %{$_[0]};
  478.     my %args    = %{$_[1]};
  479.     my $verbose = $_[2];
  480.  
  481.     my %defs; my $fail;
  482.     for my $key (keys %utmpl) {
  483.  
  484.         ### check if required keys are provided
  485.         ### keys are now lower cased, unless preserve case was enabled
  486.         ### at which point, the utmpl keys must match, but that's the users
  487.         ### problem.
  488.         if( $utmpl{$key}->{'required'} and not exists $args{$key} ) {
  489.             _store_error(
  490.                 loc(q|Required option '%1' is not provided for %2 by %3|,
  491.                     $key, _who_was_it(1), _who_was_it(2)), $verbose );
  492.  
  493.             ### mark the error ###
  494.             $fail++;
  495.             next;
  496.         }
  497.  
  498.         ### next, set the default, make sure the key exists in %defs ###
  499.         $defs{$key} = $utmpl{$key}->{'default'}
  500.                         if exists $utmpl{$key}->{'default'};
  501.  
  502.         if( $SANITY_CHECK_TEMPLATE ) {
  503.             ### last, check if they provided any weird template keys
  504.             ### -- do this last so we don't always execute this code.
  505.             ### just a small optimization.
  506.             map {   _store_error(
  507.                         loc(q|Template type '%1' not supported [at key '%2']|,
  508.                         $_, $key), 1, 1 );
  509.             } grep {
  510.                 not $known_keys{$_}
  511.             } keys %{$utmpl{$key}};
  512.         
  513.             ### make sure you passed a ref, otherwise, complain about it!
  514.             if ( exists $utmpl{$key}->{'store'} ) {
  515.                 _store_error( loc(
  516.                     q|Store variable for '%1' is not a reference!|, $key
  517.                 ), 1, 1 ) unless ref $utmpl{$key}->{'store'};
  518.             }
  519.         }
  520.     }
  521.  
  522.     ### errors found ###
  523.     return if $fail;
  524.  
  525.     ### return references so we always return 'true', even on empty
  526.     ### defaults
  527.     return \%defs;
  528. }
  529.  
  530. sub _safe_eq {
  531.     ### only do a straight 'eq' if they're both defined ###
  532.     return defined($_[0]) && defined($_[1])
  533.                 ? $_[0] eq $_[1]
  534.                 : defined($_[0]) eq defined($_[1]);
  535. }
  536.  
  537. sub _who_was_it {
  538.     my $level = $_[0] || 0;
  539.  
  540.     return (caller(2 + $CALLER_DEPTH + $level))[3] || 'ANON'
  541. }
  542.  
  543. =head2 last_error()
  544.  
  545. Returns a string containing all warnings and errors reported during
  546. the last time C<check> was called.
  547.  
  548. This is useful if you want to report then some other way than
  549. C<carp>'ing when the verbose flag is on.
  550.  
  551. It is exported upon request.
  552.  
  553. =cut
  554.  
  555. {   $_ERROR_STRING = '';
  556.  
  557.     sub _store_error {
  558.         my($err, $verbose, $offset) = @_[0..2];
  559.         $verbose ||= 0;
  560.         $offset  ||= 0;
  561.         my $level   = 1 + $offset;
  562.  
  563.         local $Carp::CarpLevel = $level;
  564.  
  565.         carp $err if $verbose;
  566.  
  567.         $_ERROR_STRING .= $err . "\n";
  568.     }
  569.  
  570.     sub _clear_error {
  571.         $_ERROR_STRING = '';
  572.     }
  573.  
  574.     sub last_error { $_ERROR_STRING }
  575. }
  576.  
  577. 1;
  578.  
  579. =head1 Global Variables
  580.  
  581. The behaviour of Params::Check can be altered by changing the
  582. following global variables:
  583.  
  584. =head2 $Params::Check::VERBOSE
  585.  
  586. This controls whether Params::Check will issue warnings and
  587. explanations as to why certain things may have failed.
  588. If you set it to 0, Params::Check will not output any warnings.
  589.  
  590. The default is 1 when L<warnings> are enabled, 0 otherwise;
  591.  
  592. =head2 $Params::Check::STRICT_TYPE
  593.  
  594. This works like the C<strict_type> option you can pass to C<check>,
  595. which will turn on C<strict_type> globally for all calls to C<check>.
  596.  
  597. The default is 0;
  598.  
  599. =head2 $Params::Check::ALLOW_UNKNOWN
  600.  
  601. If you set this flag, unknown options will still be present in the
  602. return value, rather than filtered out. This is useful if your
  603. subroutine is only interested in a few arguments, and wants to pass
  604. the rest on blindly to perhaps another subroutine.
  605.  
  606. The default is 0;
  607.  
  608. =head2 $Params::Check::STRIP_LEADING_DASHES
  609.  
  610. If you set this flag, all keys passed in the following manner:
  611.  
  612.     function( -key => 'val' );
  613.  
  614. will have their leading dashes stripped.
  615.  
  616. =head2 $Params::Check::NO_DUPLICATES
  617.  
  618. If set to true, all keys in the template that are marked as to be
  619. stored in a scalar, will also be removed from the result set.
  620.  
  621. Default is false, meaning that when you use C<store> as a template
  622. key, C<check> will put it both in the scalar you supplied, as well as
  623. in the hashref it returns.
  624.  
  625. =head2 $Params::Check::PRESERVE_CASE
  626.  
  627. If set to true, L<Params::Check> will no longer convert all keys from
  628. the user input to lowercase, but instead expect them to be in the
  629. case the template provided. This is useful when you want to use
  630. similar keys with different casing in your templates.
  631.  
  632. Understand that this removes the case-insensitivy feature of this
  633. module.
  634.  
  635. Default is 0;
  636.  
  637. =head2 $Params::Check::ONLY_ALLOW_DEFINED
  638.  
  639. If set to true, L<Params::Check> will require all values passed to be
  640. C<defined>. If you wish to enable this on a 'per key' basis, use the
  641. template option C<defined> instead.
  642.  
  643. Default is 0;
  644.  
  645. =head2 $Params::Check::SANITY_CHECK_TEMPLATE
  646.  
  647. If set to true, L<Params::Check> will sanity check templates, validating
  648. for errors and unknown keys. Although very useful for debugging, this
  649. can be somewhat slow in hot-code and large loops.
  650.  
  651. To disable this check, set this variable to C<false>.
  652.  
  653. Default is 1;
  654.  
  655. =head2 $Params::Check::WARNINGS_FATAL
  656.  
  657. If set to true, L<Params::Check> will C<croak> when an error during 
  658. template validation occurs, rather than return C<false>.
  659.  
  660. Default is 0;
  661.  
  662. =head2 $Params::Check::CALLER_DEPTH
  663.  
  664. This global modifies the argument given to C<caller()> by
  665. C<Params::Check::check()> and is useful if you have a custom wrapper
  666. function around C<Params::Check::check()>. The value must be an
  667. integer, indicating the number of wrapper functions inserted between
  668. the real function call and C<Params::Check::check()>.
  669.  
  670. Example wrapper function, using a custom stacktrace:
  671.  
  672.     sub check {
  673.         my ($template, $args_in) = @_;
  674.  
  675.         local $Params::Check::WARNINGS_FATAL = 1;
  676.         local $Params::Check::CALLER_DEPTH = $Params::Check::CALLER_DEPTH + 1;
  677.         my $args_out = Params::Check::check($template, $args_in);
  678.  
  679.         my_stacktrace(Params::Check::last_error) unless $args_out;
  680.  
  681.         return $args_out;
  682.     }
  683.  
  684. Default is 0;
  685.  
  686. =head1 AUTHOR
  687.  
  688. This module by
  689. Jos Boumans E<lt>kane@cpan.orgE<gt>.
  690.  
  691. =head1 Acknowledgements
  692.  
  693. Thanks to Richard Soderberg for his performance improvements.
  694.  
  695. =head1 COPYRIGHT
  696.  
  697. This module is
  698. copyright (c) 2003,2004 Jos Boumans E<lt>kane@cpan.orgE<gt>.
  699. All rights reserved.
  700.  
  701. This library is free software;
  702. you may redistribute and/or modify it under the same
  703. terms as Perl itself.
  704.  
  705. =cut
  706.  
  707. # Local variables:
  708. # c-indentation-style: bsd
  709. # c-basic-offset: 4
  710. # indent-tabs-mode: nil
  711. # End:
  712. # vim: expandtab shiftwidth=4:
  713.